package Negocio;

import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.*;
import DTO.ProveedorVO;

@Entity
@Table(name="proveedores")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="tipoProveedor", discriminatorType=DiscriminatorType.STRING)
public abstract class Proveedor 
{
	@Id
	@Column(name="cuit")
	private long cuit;
	@Column(name="nombre")
	private String nombre;
	@OneToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="idDireccion")
	private Direccion direccion;
	@OneToMany(cascade=CascadeType.ALL)
	@JoinColumn(name="cuit")
	private Collection<FacturaProveedor> facturas;
	
	public Proveedor(long cuit, String nombre, Direccion direccion)
	{
		this.cuit = cuit;
		this.nombre = nombre;
		this.direccion = direccion;
		this.facturas = new ArrayList<FacturaProveedor>();
	}
	
	public Proveedor() {}

	public abstract boolean esCarrier();
	public abstract boolean esTallerGeneral();
	public abstract boolean esTallerOficial();
	public abstract boolean esAgenteOficial();
	public abstract boolean esEmpresaSeguros();
	public abstract boolean esEmpresaSeguridad();

	public long getCuit() {
		return cuit;
	}

	public void setCuit(long cuit) {
		this.cuit = cuit;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public Direccion getDireccion() {
		return direccion;
	}

	public void setDireccion(Direccion direccion) {
		this.direccion = direccion;
	}

	public Collection<FacturaProveedor> getFacturas() {
		return facturas;
	}

	public void setFacturas(ArrayList<FacturaProveedor> facturas) {
		this.facturas = facturas;
	}
	
	public void agregarFactura(FacturaProveedor factura){
		if (!tenesEstaFactura(factura))
			facturas.add(factura);
	}

	public boolean tenesEstaFactura(FacturaProveedor factura) {
		for(FacturaProveedor fac : facturas)
			if(fac.sosLaFactura(factura.getIdFacturaProveedor()))
				return true;
		return false;
	}

	public boolean sosElProveedor(long cuit2) {
		return this.cuit == cuit2;
	}

	public abstract ProveedorVO toVO();
}
